#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 打印信息
info() {
    echo -e "${GREEN}[信息]${NC} $1"
}

warn() {
    echo -e "${YELLOW}[警告]${NC} $1"
}

error() {
    echo -e "${RED}[错误]${NC} $1"
    exit 1
}

# 检查Go环境
check_go() {
    info "检查Go环境..."
    if ! command -v go &> /dev/null; then
        error "Go未安装，请先安装Go"
    fi

    # 检查Go版本
    GO_VERSION=$(go version | awk '{print $3}' | sed 's/go//')
    if [[ "${GO_VERSION}" < "1.21" ]]; then
        error "Go版本过低，需要1.21或更高版本"
    fi

    info "Go版本: ${GO_VERSION}"
}

# 检查依赖
check_deps() {
    info "检查依赖..."
    go mod download || error "依赖下载失败"
    info "依赖检查完成"
}

# 代码格式化
format_code() {
    info "格式化代码..."
    go fmt ./... || warn "代码格式化失败"
    info "代码格式化完成"
}

# 代码检查
check_code() {
    info "检查代码..."
    go vet ./... || warn "代码检查发现问题"
    info "代码检查完成"
}

# 运行测试
run_tests() {
    info "运行测试..."
    go test -v -race ./... || error "测试失败"
    info "测试完成"
}

# 构建项目
build_binary() {
    info "构建项目..."
    
    # 获取版本信息
    VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "dev")
    GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
    BUILD_TIME=$(date "+%Y-%m-%d %H:%M:%S")

    # 创建输出目录
    mkdir -p bin

    # 构建二进制文件
    CGO_ENABLED=0 go build \
        -ldflags "-X main.Version=${VERSION} -X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" \
        -o bin/deployer \
        cmd/deployer/main.go || error "构建失败"

    info "构建完成: bin/deployer"
    info "版本: ${VERSION}"
    info "提交: ${GIT_COMMIT}"
    info "时间: ${BUILD_TIME}"
}

# 主函数
main() {
    echo "Deployer 本地构建"
    echo "================="

    # 执行构建步骤
    check_go
    check_deps
    format_code
    check_code
    run_tests
    build_binary

    echo "================="
    info "本地构建完成"
    info "二进制文件位置: bin/deployer"
    info "执行 './bin/deployer --help' 查看使用说明"
}

# 执行主函数
main
